package org.example.sys.controller;


import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
import io.swagger.v3.oas.annotations.Operation;
import org.example.core.web.PageResult;
import org.example.core.web.Result;
import org.example.sys.entity.TSysMenu;
import org.example.sys.entity.base.BatchParam;
import org.example.sys.entity.base.PageParam;
import org.example.sys.entity.param.MenuParam;
import org.example.sys.service.TSysMenuService;
import org.springframework.security.access.prepost.PreAuthorize;
import org.springframework.web.bind.annotation.*;
import javax.annotation.Resource;
import java.util.List;
import java.util.Optional;

/**
 * 目录表(TSysMenu)表控制层
 * @author Calvin
 */
@RestController
@RequestMapping("/api/system/menu")
public class TSysMenuController extends ApiController {
    /**
     * 服务对象
     */
    @Resource
    private TSysMenuService tSysMenuService;

    /**
     * 分页查询所有数据
     * @return 所有数据
     */
    @PreAuthorize("hasAuthority('sys:menu:list')")
    @Operation(summary = "分页查询菜单")
    @GetMapping("/page")
    public Result<PageResult<TSysMenu>> getPage(MenuParam menuParam) {
        PageParam<TSysMenu, MenuParam> pageParam = new PageParam<>(menuParam);
        pageParam.setDefaultOrder("sort_number");
        return success(tSysMenuService.page(pageParam, pageParam.getWrapper()));
    }

    /**
     * 分页查询所有数据
     * @return 所有数据
     */
    @PreAuthorize("hasAuthority('sys:menu:list')")
    @Operation(summary = "查询全部菜单")
    @GetMapping("/list")
    public Result<List<TSysMenu>> list(MenuParam menuParam) {
        PageParam<TSysMenu, MenuParam> pageParam = new PageParam<>(menuParam);
        pageParam.setDefaultOrder("sort_number");
        return success(tSysMenuService.list(pageParam, pageParam.getWrapper()));
    }

    /**
     * 通过主键查询单条数据
     * @param id 主键
     * @return 单条数据
     */
    @PreAuthorize("hasAuthority('sys:menu:list')")
    @GetMapping("/{id}")
    public Result<TSysMenu> selectOne(@PathVariable Long id) {
        TSysMenu tSysMenu = tSysMenuService.getOne(new LambdaQueryWrapper<TSysMenu>()
                .eq(TSysMenu::getMenuId, id));
        return success(tSysMenu);
    }

    /**
     * 新增数据
     * @param tSysMenu 实体对象
     * @return 新增结果
     */
    @PostMapping("/addMenu")
    public Result<String> addMenu(@RequestBody TSysMenu tSysMenu) {
        tSysMenu.setParentId(Optional.ofNullable(tSysMenu.getParentId()).orElse(0L));
        return tSysMenuService.save(tSysMenu) ? success("添加成功") : (Result<String>) fail("添加失败");
    }

    /**
     * 修改数据
     * @param tSysMenu 实体对象
     * @return 修改结果
     */
    @PreAuthorize("hasAuthority('sys:menu:update')")
    @PutMapping
    public Result<Boolean> updateMenu(@RequestBody TSysMenu tSysMenu) {
        return success(this.tSysMenuService.updateById(tSysMenu));
    }

    /**
     * 删除数据
     * @param id 实体对象
     * @return 修改结果
     */
    @PreAuthorize("hasAuthority('sys:menu:remove')")
    @Operation(summary = "删除菜单")
    @DeleteMapping("/{id}")
    public Result<?> removeMenu(@PathVariable("id") Integer id) {
        return tSysMenuService.removeById(id) ? success("删除成功") : fail("删除失败");
    }

    /**
     * 批量添加菜单
     * @param menus
     * @return
     */
    @PreAuthorize("hasAuthority('sys:menu:save')")
    @Operation(summary = "批量添加菜单")
    @PostMapping("/batch")
    public Result<?> addMenusBatch(@RequestBody List<TSysMenu> menus) {
        return tSysMenuService.saveBatch(menus) ? success("添加成功") : fail("添加失败");
    }

    /**
     * 批量修改菜单
     * @param batchParam
     * @return
     */
    @PreAuthorize("hasAuthority('sys:menu:update')")
    @Operation(summary = "批量修改菜单")
    @PutMapping("/batch")
    public Result<?> updateMenusBatch(@RequestBody BatchParam<TSysMenu> batchParam) {
        return batchParam.update(tSysMenuService, "menu_id") ? success("修改成功") : fail("修改失败");
    }

    /**
     * 批量删除菜单
     * @param ids
     * @return
     */
    @PreAuthorize("hasAuthority('sys:menu:remove')")
    @Operation(summary = "批量删除菜单")
    @DeleteMapping("/batch")
    public Result<?> removeMenusBatch(@RequestBody List<Integer> ids) {
        return tSysMenuService.removeByIds(ids) ? success("删除成功") : fail("删除失败");
    }
}

